// Learn TypeScript:
//  - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// Learn Attribute:
//  - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
//  - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html
import global from "../global";
const { ccclass, property } = cc._decorator;

@ccclass
export default class FlyObj extends cc.Component {
    // LIFE-CYCLE CALLBACKS:
    public nodeName: string = "FlyObj";

    public ObjSprite: cc.Sprite = null;

    public circleCollider: cc.CircleCollider = null; // 碰撞检测组件
    // public colliderManager: cc.CollisionManager = null; // 碰撞检测控制系统

    // public rigidBody: cc.RigidBody = null; //刚体组件
    // public physicsCircleCollider: cc.PhysicsCircleCollider = null; // 物理碰撞组件

    onLoad() {
        // console.log("Fly onload");
        // console.log(this.node.name);

        this.node.name = "FlyObj";              // 设置当前节点的名字，要与当前类名相同，方便在碰撞中识别

        this.ObjSprite = this.node.addComponent(cc.Sprite);  // 显示图片的组件

        this.circleCollider = this.node.addComponent(cc.CircleCollider); // 圆形碰撞检测组件
        this.circleCollider.name = "FlyObj";    // 设置圆形碰撞检测组件的名字，要与当前类名相同

        // this.setInfo({x: 0, y:0, width: 100, height: 100})
        // 碰撞系统是全局的，只需要在最外层实现即可
        //this.colliderManager = cc.director.getCollisionManager();
        //this.colliderManager.enabled = true;                // 开启碰撞检测
        //this.colliderManager.enabledDebugDraw = true;       // 显示碰撞检测边缘
        //this.colliderManager.enabledDrawBoundingBox = true; // 显示碰撞检测边缘

        // this.rigidBody = this.ObjNode.addComponent(cc.RigidBody);  // 刚体组件实例化
        // this.physicsCircleCollider = this.ObjNode.addComponent(cc.PhysicsCircleCollider);  // 物理圆形碰撞组件实例化

        // this.rigidBody.enabledContactListener = true;              // 开启刚体碰撞检测的监听

        // this.setPhoto();  // 为了避免获取多个资源影响速度，setPhoto在子类中再设置
    }

    start() {

    }
    // update(dt){}
    /**
     * 设置当前节点的位置与大小
     * @param Info NodeInfoPara接口
     */
    setInfo(Info: NodeInfoPara) {
        this.node.setPosition(Info.x, Info.y);
        // console.log("setInfo");
        // console.log({x: this.node.x, y: this.node.y, name: this.node.name});
        if (Info.width) {
            this.node.width = Info.width;
            this.circleCollider.radius = Info.width / 2;
        }
        if (Info.height) {
            this.node.height = Info.height;
        }
        else {
            this.node.height = Info.width;
        }
    }

    /**
     * 设置当前组件的图片,目前只支持用url远程获取
     * @param url 图片的url
     */
    async setPhoto(url?: string) {//加载url内的图片作为飞行物显示出来
        url = !!url ? url : 'https://njc-download.weiyun.com/ftn_handler/9f7d12285ffdf1c09c85e20d5f5acb97575de79aea7cb10ab9088a561d132b09be79bcc986270ae8fed9c6f89c385fc6de1b20b4012be6eb57f702fe4424cb86/Earth.png?fname=Earth.png&from=30113&version=3.3.3.3';
        var self = this;
        return new Promise<number>   // Promise类与await配合，用来对资源的异步进行同步化，现在暂时不需要用到
            (
                (resolve, reject) => {
                    cc.assetManager.loadRemote(url, { ext: '.jpg' }, (err, texture) => {
                        let temWidth = this.node.width;
                        let temheight = this.node.height;
                        self.ObjSprite.spriteFrame = new cc.SpriteFrame(texture); // 传入图片
                        self.node.width = temWidth;          // 将图片形状还原到原本大小
                        self.node.height = temheight;
                        resolve(0);
                    });
                }
            );
    }

    setLocalPhoto(path: string) {
        var self = this;
        cc.resources.load(path, function (err, texture) {
            let temWidth = self.node.width;
            let temheight = self.node.height;
            self.ObjSprite.spriteFrame = new cc.SpriteFrame(texture);
            self.node.width = temWidth;          // 将图片形状还原到原本大小
            self.node.height = temheight;
        });
    }

    // update (dt) {}

    // 等待子类实现的函数
    /**
     * 当碰撞产生的时候调用
     * @param  {Collider} other 产生碰撞的另一个碰撞组件
     * @param  {Collider} self  产生碰撞的自身的碰撞组件
     */
    //onCollisionStay(other, self) {}


    /**
     * 当碰撞产生后，碰撞结束前的情况下，每次计算碰撞结果后调用
     * @param  {Collider} other 产生碰撞的另一个碰撞组件
     * @param  {Collider} self  产生碰撞的自身的碰撞组件
     */
    //onCollisionEnter(other, self) {}

    /**
     * 当碰撞结束后调用
     * @param  {Collider} other 产生碰撞的另一个碰撞组件
     * @param  {Collider} self  产生碰撞的自身的碰撞组件
     */
    //onCollisionExit(other, self) {}
}
